iT邦幫忙

DAY 22
0

練習如何去開發一個通訊軟體 Boo it!系列 第 22

Day22 - 歷史訊息。記錄每一個對話過程。

  • 分享至 

  • xImage
  •  

好的,最後我們重新檢視我們的訊息交換中心。

require 'em-websocket'

require 'mongo'

require 'json'

include Mongo

#

# connecting to the database (for history)

#

client = MongoClient.new # defaults to localhost:27017

db     = client['Boo']

@coll  = db['dialog']

#

# boo_log history method

#

def boo_log(logStr)

    _currentTime = Time.new.to_s

    _logAry = logStr.split(',')

    _sortAry = [_logAry[0].to_s,_logAry[1].to_s].sort

    _did = _sortAry[0].to_s + _sortAry[1].to_s

    if @coll.find("did" => _did).to_a.empty?

        # if not found , then insert

        _jsonObj_insert = {:did => _did,:dialog => [{:from => _logAry[0] , :to => _logAry[1] , :datetime => _currentTime , :log => _logAry[2]}]}

        @coll.insert(_jsonObj_insert)

    else

       # if found , then update

       @coll.update({:did => _did}, {:$push => {:dialog => {:from => _logAry[0] , :to => _logAry[1] , :datetime => _currentTime , :log => _logAry[2]}}},:upsert => true)

    end

end

#

# chat server

#

puts "Server is listening!..."

@uid = []

@sid = []

@channel_list = []

EM.run {

    @channel = EM::Channel.new

  EM::WebSocket.run(:host => "0.0.0.0", :port => 8080) do |ws|

    ws.onopen { |handshake|

      puts "WebSocket connection open"

      # first message to subscribe channel

      @sid << @channel.subscribe {|msg|

          puts "received:" + msg + "---"

          ws.send msg # send itself

          puts "history record"

      }

      tid = @sid.last

      puts "#{@sid.last} connect!"

      ws.onmessage {|msg|

          @uid = msg.split(/,/)

          @channel.push "#{msg}"

          boo_log(msg.to_s)

      }

      ws.onclose {

          @channel.unsubscribe(tid)

          puts "#{tid} conection closed!"

      }

    }  # onopen end

  end

}

我們可以看到 在訊息溝通的時候,會先將前述的訊息格式進行解析parse的動作。並且進行發送,在client端會去接收訊息。然後呼叫boo_log() 方法來寫入資料庫。

以下是boo_log() 方法:

def boo_log(logStr)

    _currentTime = Time.new.to_s

    _logAry = logStr.split(',')

    _sortAry = [_logAry[0].to_s,_logAry[1].to_s].sort

    _did = _sortAry[0].to_s + _sortAry[1].to_s

    if @coll.find("did" => _did).to_a.empty?

        # if not found , then insert

        _jsonObj_insert = {:did => _did,:dialog => [{:from => _logAry[0] , :to => _logAry[1] , :datetime => _currentTime , :log => _logAry[2]}]}

        @coll.insert(_jsonObj_insert)

    else

       # if found , then update

       @coll.update({:did => _did}, {:$push => {:dialog => {:from => _logAry[0] , :to => _logAry[1] , :datetime => _currentTime , :log => _logAry[2]}}},:upsert => true)

    end

end

接著我們可以在server端,直接使用mongo指令進入資料庫。

Mongo

並且使用資料庫Boo 來查看我們的資料表(Collections)

Use boo

可以看我們在歷史訊息之中資料庫的寫入狀況。

Db.dialog.find()

至於格式如下:

我們可以看到發送端 以及傳送端。 如果已經建立歷史訊息,則在原則上我們會以Update資料表。

@coll.update({:did => _did}, {:$push => {:dialog => {:from => _logAry[0] , :to => _logAry[1] , :datetime => _currentTime , :log => _logAry[2]}}},:upsert => true)

反之,如果沒有歷史訊息,也就是說第一次寫入,我們會將新的資料表insert進入。

@coll.insert(_jsonObj_insert)

可以看到歷史訊息的格式,每次歷史訊息會以陣列的方式進入。所以在程式碼上我們會做個判斷。

當然在歷史訊息的設計上,我們可以使用session storage來減少server端的存取次數。

這點可以利用HTML5的storage來幫助我們進行這功能的改善。


上一篇
Day 21 Boo-it Au_server – 3 終曲。
下一篇
Day23 - Boo-it 架構
系列文
練習如何去開發一個通訊軟體 Boo it!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言